home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK1.toast / Development Kits (Disc 1) / Open Transport / OT1.1 Developer Release / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTMulticastCatchSample.cp < prev    next >
Encoding:
Text File  |  1996-11-19  |  5.6 KB  |  220 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTMulticastcatch.cp
  3.  
  4.     Contains:    Sample program to receive UDP/IP multicasts.
  5.  
  6.     Copyright:    © 1993-1995 by Apple Computer, Inc., all rights reserved.
  7.  
  8.     
  9. */
  10.  
  11.  
  12. #include <OpenTptInternet.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <Events.h>
  16. #include <Quickdraw.h>
  17.  
  18.  
  19. /*******************************************************************************
  20. ** Misc defines
  21. ********************************************************************************/
  22.  
  23. const size_t    kMyPoolSize = 60000;
  24.  
  25.  
  26. /*******************************************************************************
  27. ** Globals
  28. ********************************************************************************/
  29.  
  30. char            gMulticastAddrStr[] = "235.1.2.3";
  31. InetPort        gMulticastPort = 2345;
  32. InetHost        gMulticastHost;
  33. InetAddress        gMulticastAddr;
  34. Boolean            gDataEvent = false;
  35. EndpointRef        gEndpt;
  36. char            gMessage[256];
  37.  
  38. /*******************************************************************************
  39. ** EventHandler
  40. ********************************************************************************/
  41.  
  42. pascal void EventHandler(void*, OTEventCode event, OTResult, void*)
  43. {
  44.     if (event == T_DATA)
  45.         gDataEvent = true;
  46.     return;
  47. }
  48.  
  49.  
  50. /*******************************************************************************
  51. ** SetupMulticast
  52. ********************************************************************************/
  53.  
  54. OSStatus SetupMulticast()
  55. {
  56.     TEndpointInfo    info;
  57.     OSStatus        err = kOTNoError;
  58.     InetAddress        myAddr;
  59.  
  60.     fprintf(stderr, "The program receives multicasts on IPAddr <%s> port <%d>\n", 
  61.         gMulticastAddrStr, gMulticastPort);
  62.     
  63.     do
  64.     {
  65.         //
  66.         //    Get a UDP endpoint which can be used for IP Multicast receives
  67.         //
  68.         
  69.         gEndpt = OTOpenEndpoint(OTCreateConfiguration(kUDPName), 0, &info, &err);
  70.         if ( gEndpt == NULL || err != kOTNoError )
  71.         {
  72.             fprintf(stderr, "ERROR: OpenEndpoint(UDP) failed with error <%d>\n", err);
  73.             break;
  74.         }
  75.         
  76.         //
  77.         //    Set up an Inet Address for the multicast group 
  78.         //    using our multicast address string and defined port number.
  79.         //
  80.         
  81.         OTInetStringToHost(gMulticastAddrStr, &gMulticastHost);
  82.         OTInitInetAddress(&gMulticastAddr, gMulticastPort, gMulticastHost);
  83.     
  84.         //
  85.         //    Do a normal bind to the any IP addr on our system (by entering 0 as 
  86.         //    a wildcard IP address) using the multicast port.
  87.         //    It's OK to use req for both input and output.
  88.         //
  89.         
  90.         OTInitInetAddress(&myAddr, gMulticastPort, 0);
  91.         TBind bindReq;
  92.         bindReq.addr.len = sizeof(myAddr);
  93.         bindReq.addr.maxlen = sizeof(myAddr);
  94.         bindReq.addr.buf = (unsigned char*) &myAddr;
  95.         err = gEndpt->Bind(&bindReq, &bindReq);
  96.         if ( err != kOTNoError )
  97.         {
  98.             fprintf(stderr, "ERROR: Bind() failed with error <%d>\n", err);
  99.             break;
  100.         }
  101.     
  102.         //
  103.         //    Let IP know to listen for this multicast IP address on all interfaces.
  104.         //    
  105.         
  106.         TOptMgmt             optReq;
  107.         UInt8                 optBuffer[ kOTOptionHeaderSize + sizeof(TIPAddMulticast) ];
  108.         TOption*             opt = (TOption*)optBuffer;
  109.         TIPAddMulticast*    addopt = (TIPAddMulticast*)opt->value; 
  110.         
  111.         optReq.flags = T_NEGOTIATE;
  112.         optReq.opt.len = sizeof(optBuffer);
  113.         optReq.opt.buf = (UInt8*) optBuffer;
  114.         
  115.         opt->level = INET_IP;
  116.         opt->name = IP_ADD_MEMBERSHIP;
  117.         opt->len = sizeof(optBuffer);
  118.         
  119.         addopt->multicastGroupAddress = gMulticastHost;
  120.         addopt->interfaceAddress = kOTAnyInetAddress;
  121.         
  122.         err = gEndpt->OptionManagement(&optReq, &optReq);
  123.         if ( err != kOTNoError )
  124.         {
  125.             fprintf(stderr, "ERROR: OTOptionManagement() failed with %d\n", err);
  126.             break;
  127.         }
  128.         
  129.         //
  130.         //    Now install a notifier for and switch to asynchronous mode.
  131.         //
  132.         
  133.         err = gEndpt->InstallNotifier((OTNotifyProcPtr)&EventHandler, 0);
  134.         if ( err != kOTNoError )
  135.         {
  136.             fprintf(stderr, "ERROR: InstallNotifier() failed with error <%d>\n", err);
  137.             break;
  138.         }
  139.         err = gEndpt->SetAsynchronous();
  140.         if ( err != kOTNoError )
  141.         {
  142.             fprintf(stderr, "ERROR: SetAsynchronous() failed with error <%d>\n", err);
  143.             break;
  144.         }
  145.     } while(false);
  146.     return ( err != kOTNoError );
  147. }
  148.  
  149.  
  150. /*******************************************************************************
  151. ** Cleanup
  152. ********************************************************************************/
  153.  
  154. void Cleanup()
  155. {
  156.     gEndpt->Close(); 
  157. }
  158.  
  159.  
  160. /*******************************************************************************
  161. ** RecvLoop
  162. ********************************************************************************/
  163.  
  164. void RecvLoop()
  165. {
  166.     TUnitData    unitdata;
  167.     InetAddress    addr;
  168.     OTFlags        flags;
  169.     char        remoteAddrStr[32];
  170.     char        messageBuf[128];
  171.  
  172.     memset(messageBuf, 0, sizeof(messageBuf));
  173.     memset(remoteAddrStr, 0, sizeof(remoteAddrStr));
  174.     while ( !Button() )
  175.     {
  176.         if ( gDataEvent )
  177.         {
  178.             gDataEvent = false;
  179.             unitdata.addr.maxlen = sizeof(addr);
  180.             unitdata.addr.buf = (unsigned char*) &addr;
  181.             unitdata.opt.maxlen = 0;
  182.             unitdata.opt.buf = 0;
  183.             unitdata.udata.maxlen = sizeof(gMessage);
  184.             unitdata.udata.buf = (UInt8*) gMessage;
  185.             gEndpt->RcvUData( &unitdata, &flags);
  186.             OTInetHostToString( addr.fHost, remoteAddrStr);
  187.             fprintf(stderr, "IP multicast from <%s>:%s\n", remoteAddrStr, gMessage);
  188.             memset(messageBuf, 0, unitdata.udata.len);             
  189.             memset(remoteAddrStr, 0, sizeof(remoteAddrStr));
  190.         }
  191.     }
  192. }
  193.  
  194.  
  195. /*******************************************************************************
  196. ** Inits
  197. ********************************************************************************/
  198.  
  199. void Inits()
  200. {
  201.     InitGraf(&qd.thePort);
  202.     if ( InitOpenTransport() != kOTNoError )
  203.     {
  204.         fprintf(stderr, "MulticastCatchSample: Could not initialize ASLM\n");
  205.         exit(1);
  206.     }
  207. }
  208.  
  209.  
  210. /*******************************************************************************
  211. ** Main
  212. ********************************************************************************/
  213.  
  214. void main()
  215. {
  216.     Inits();
  217.     if ( SetupMulticast() == kOTNoError )
  218.         RecvLoop();
  219.     Cleanup();
  220. }